package com.sunrise.financeiro.bean;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ComponentSystemEvent;

import lombok.Getter;

import org.springframework.stereotype.Controller;

import com.sunrise.financeiro.servico.ManterCategoriaFinanceiraService;
import com.sunrise.financeiro.visao.CategoriaFinanceiraForm;
import com.sunrise.generico.bean.ManterBean;
import com.sunrise.generico.entidade.CategoriaFinanceira;
import com.sunrise.generico.entidade.GrupoCategoriaFinanceira;
import com.sunrise.generico.enums.TipoMovimentacaoFinanceira;
import com.sunrise.generico.enums.TipoStatus;
import com.sunrise.generico.util.MessagesUtil;
import com.sunrise.generico.visao.Filtro;

@ManagedBean
@ViewScoped
@Controller
public class ManterCategoriaFinanceiraBean extends ManterBean<CategoriaFinanceira> {

	@Resource
	@Getter
	private ManterCategoriaFinanceiraService categoriaFinanceiraService;

	@Resource
	@Getter
	private CategoriaFinanceiraForm formulario;

	@Override
	public void preRenderNew(ComponentSystemEvent event) {
		if (getEntidade() == null) {
			inicializarEntidade();
		}
		inicializarFormulario();
	}

	private void inicializarFormulario() {
		getFormulario().setTiposMovimentacaoFinanceira(Arrays.asList(TipoMovimentacaoFinanceira.values()));
	}

	@Override
	public void preRenderEdit(ComponentSystemEvent event) {
		inicializarFormulario();
	}

	@Override
	public void preRenderList(ComponentSystemEvent event) {
		inicializarFormulario();
		setStatus(Arrays.asList(TipoStatus.values()));
		inicializarEntidade();
		setFiltro(new Filtro());
		getFiltro().setAtivo(getStatus().iterator().next());
		buscarPorFiltros();
	}

	@Override
	public void inicializarEntidade() {
		setEntidade(new CategoriaFinanceira());
		getEntidade().setAtivo(Boolean.TRUE);
		getEntidade().setGrupoCategoriaFinanceira(new GrupoCategoriaFinanceira());
	}

	@Override
	public List<CategoriaFinanceira> iniciarlizarListEntidade() {
		return new ArrayList<CategoriaFinanceira>();
	}

	public String habilitar() {
		try {
			getEntidade().setAtivo(Boolean.TRUE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroHabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoHabilitado"));
			return null;
		}
	}

	public String desabilitar() {
		try {
			getEntidade().setAtivo(Boolean.FALSE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroDesabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoDesabilitado"));
			return null;
		}
	}

	public void buscarPorFiltros() {
		setEntidades(getCategoriaFinanceiraService().buscarPorFiltros(getFiltro()));
	}

	public void carregarGruposCategoriaFinanceira() {
		if (getEntidade().getTipoMovimentacaoFinanceira() != null) {
			getFormulario().setGruposCategoriaFinanceira(
					getCategoriaFinanceiraService().listarGruposPorTipoMovimentacao(
							getEntidade().getTipoMovimentacaoFinanceira()));
		} else {
			getFormulario().setGruposCategoriaFinanceira(new ArrayList<GrupoCategoriaFinanceira>());
		}
	}

	public void carregarFiltroGruposCategoriaFinanceira() {
		if (getFiltro().getTipoMovimentacaoFinanceira() != null) {
			getFormulario().setGruposCategoriaFinanceira(
					getCategoriaFinanceiraService().listarGruposPorTipoMovimentacao(
							getFiltro().getTipoMovimentacaoFinanceira()));
		} else {
			getFormulario().setGruposCategoriaFinanceira(new ArrayList<GrupoCategoriaFinanceira>());
		}
		buscarPorFiltros();
	}

}
